package array.easy;

/**
 * 给你一个有序数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。
 * 不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
 */
public class removeDuplicates {

    public static void main(String[] args) {
        int[] test = {0, 0, 0, 1, 1, 1, 1, 2, 3, 3};
//        myCode(test);
        myCode2(test);
    }

    /**
     * 删除有序数组的重复项，每个元素只能存在一次
     *
     * @param nums
     * @return
     */
    public static int myCode(int[] nums) {
        if (nums == null) {
            return 0;
        } else if (nums.length == 1) {
            return 1;
        }
        int j = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[j] != nums[i]) {
                nums[++j] = nums[i];
            }
        }
        return j + 1;
    }

    /**
     * 删除有序数组的重复项，每个元素最多存在两次
     * 双指针之所以能简化时间复杂度，在遍历指针运行的同时。
     * 另一个指针要负责记录需要的数据。
     * @param nums
     * @return
     */
    public static int myCode2(int[] nums) {
        int j = 1;
        int count = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i - 1] == nums[i]) {
                count++;
            } else {
                count = 0;
            }
            if (count <= 1) {
                nums[j++] = nums[i];
            }
        }
        return j;
    }
}
